package persistence

import (
	"Data-API-MCP/backend/configs"
	"fmt"
	"sync"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var (
	db   *gorm.DB
	once sync.Once
)

// InitDB 初始化数据库连接
func InitDB(config *configs.Config) error {
	var err error
	once.Do(func() {
		dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
			config.Database.MySQL.Username,
			config.Database.MySQL.Password,
			config.Database.MySQL.Host,
			config.Database.MySQL.Port,
			config.Database.MySQL.DBName,
		)

		// 配置GORM
		gormConfig := &gorm.Config{
			Logger: logger.Default.LogMode(logger.Info),
		}

		// 连接数据库
		db, err = gorm.Open(mysql.Open(dsn), gormConfig)
		if err != nil {
			return
		}

		// 设置连接池
		sqlDB, err := db.DB()
		if err != nil {
			return
		}

		// 设置最大空闲连接数
		sqlDB.SetMaxIdleConns(config.Database.MySQL.MaxIdleConns)
		// 设置最大打开连接数
		sqlDB.SetMaxOpenConns(config.Database.MySQL.MaxOpenConns)
		// 设置连接最大生命周期
		sqlDB.SetConnMaxLifetime(config.Database.MySQL.ConnMaxLifetime)
	})

	return err
}

// GetDB 获取数据库连接
func GetDB() *gorm.DB {
	return db
}

// CloseDB 关闭数据库连接
func CloseDB() error {
	if db != nil {
		sqlDB, err := db.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}
